import os

from flask import jsonify, json, Response, send_file, request
import io
import pandas as pd


# 自定义获取真实 IP 的函数
def get_real_ip():
    # 优先从 X-Real-IP 获取
    real_ip = request.headers.get('X-Real-IP')
    if real_ip:
        return real_ip
    # 如果 X-Real-IP 不存在，尝试从 X-Forwarded-For 获取
    forwarded_for = request.headers.get('X-Forwarded-For')
    if forwarded_for:
        # X-Forwarded-For 可能包含多个 IP 地址，以逗号分隔
        # 最左边的 IP 地址是原始客户端的 IP
        return forwarded_for.split(',')[0].strip()
    # 如果都没有，返回默认的远程 IP（可能是代理服务器的 IP）
    return request.remote_addr


def result_success(msg: str = "success"):
    """
    返回成功的 API 响应。

    :param msg: 成功消息内容，默认为 "成功"。
    :return: 返回 JSON 格式的响应，包含 `success` 和 `msg` 字段。
    """
    return jsonify(success=True, msg=msg)


def result_fail(msg: str = "fail"):
    """
    返回失败的 API 响应。

    :param msg: 失败消息内容，默认为 "失败"。
    :return: 返回 JSON 格式的响应，包含 `success` 和 `msg` 字段。
    """
    return jsonify(success=False, msg=msg)


def get_json(json_path):
    with open(json_path, 'r', encoding="utf-8") as f:
        res = json.load(f)
    return res


def result_json(json_path):
    with open(json_path, 'r', encoding="utf-8") as f:
        res = json.load(f)
    return jsonify(res)


def result(data=None, msg: str = "success", json_path: str = None, result_type: str = "json"):
    """
    返回动态表格渲染所需的 API 响应。

    :param result_type: 返回类型
    :param json_path: 本地json文件路径
    :param msg: 响应消息内容，默认为空字符串。
    :param data: 表格数据，默认为 None。
    :return: 返回 JSON 格式的响应，包含 `msg`、`code`、`data` 字段。
    """
    if result_type == "json":
        if isinstance(data, str) and os.path.exists(data) and data.endswith(".json"):
            return result_json(data)

        if json_path is not None:
            return result_json(json_path)

        res = {
            'msg': msg,
            'code': 200,
            'data': data
        }
        return jsonify(res)

    if result_type == "csv":
        return Response(
            data,
            mimetype='text/csv',
            headers={'Content-Disposition': 'attachment;filename=data.csv'}
        )

    if result_type == "xls" or result_type == "xlsx":
        # 创建一个内存中的 Excel 文件
        output = io.BytesIO()
        with pd.ExcelWriter(output, engine='openpyxl') as writer:
            data.to_excel(writer, index=False)

        # 将内存中的 Excel 文件移动到开头
        output.seek(0)

        # 设置响应头，指定内容类型为 Excel 文件，并提供文件名
        return Response(
            output.read(),
            mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            headers={'Content-Disposition': 'attachment;filename=data.xlsx'}
        )
    if result_type == "png" or result_type == "PNG":
        return send_file(data, mimetype='image/png')
    if result_type == "svg" or result_type == "SVG":
        return send_file(data, mimetype='image/svg+xml')
    if result_type == "jpg" or result_type == "jpeg" or result_type == "JPG" or result_type == "JPEG":
        return send_file(data, mimetype='image/jpg')
